//
//  Modelo_Tablero.h
//  PEI
//
//  Created by asc on 04/04/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef PEI_Modelo_Tablero_h
#define PEI_Modelo_Tablero_h

#include "Modelo.h"
#include "Modelo_Casilla.h"
#include "Modelo_Variantes.h"


class tablero : public Modelo{

public:

/*! 
 \brief Constructor del tablero
 \retva : 
 \param 16 : 
 \param 4 : 
 \param false : 
*/
    tablero(int tam=16,int mode=4, bool aleatorio=false);
/*! 
 \brief	Carga tablero desde fichero 
 \retval :
 \param fichero : 
 \param 4 : 
*/
    tablero(string fichero, int mode=4);
/*! 
 \brief Destructor
 \retval :
 \param  : 
*/
    ~tablero();

/*! 
 \brief tamayno de la fila tablero 
 \retval int :
 \param  : 
*/
    int getRows();
/*! 
 \brief 
 \retval int :
 \param  : 
*/
    int getNItems();
/*! 
 \brief numero de generacion
 \retval int :
 \param  : 
*/
    int getGeneracion();
/*! 
 \brief 
 \retval :
 \param  : 
*/
    vector<casilla> getTablero();
/*! 
 \brief 
 \retval variantes* :
 \param  : 
*/
    variantes* getVariante();

/*! 
 \brief Calcula la siguiente generacion
 \retval void :
 \param  : 
*/
    void calculaSiguienteEtapa();
/*! 
 \brief Enlaza con las casillas vecinas todo el tablero
 \retval void :
 \param false : Generacion Tablero Aleatorio
*/
    void enlazaCasillas(bool aleatorio=false);
/*! 
 \brief Calcula la siguiente etapa del nodo it
 \retval void :
 \param it : 
*/
    void siguienteEtapaNodo(vector<casilla>::iterator it);
/*! 
 \brief Actualiza el nodo con el valor de la siguiente Generacion
 \retval void :
 \param it : 
*/
    void actualizaNodo(vector<casilla>::iterator it);
/*! 
 \brief Cambia el estado por su inverso
 \retval void :
 \param i : 
 \param j : 
*/
    void cambiaEstado(int i, int j);
/*! 
 \brief Retorna el valor del estado
 \retval bool :
 \param i : 
 \param j : 
*/
    bool getEstado(int i, int j);
/*! 
 \brief Cambia el algoritmo evolutivo
 \retval void :
 \param i : 
*/
    void cambiaVariante(int i);
/*! 
 \brief Guarda el tablero en un fichero
 \retval void :
 \param fichero : 
*/
    void guarda(string fichero);

private:
    vector<casilla> table;
    vector<casilla>::iterator it;
    variantes mod;
    int rows;
    int nitems;
    int generacion;
};

#endif
